// 题目描述：
// 给你两个字符串 haystack 和 needle ，请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标（下标从 0 开始）。如果 needle 不是 haystack 的一部分，则返回  -1 。

 

// 示例 1：

// 输入：haystack = "sadbutsad", needle = "sad"
// 输出：0
// 解释："sad" 在下标 0 和 6 处匹配。
// 第一个匹配项的下标是 0 ，所以返回 0 。
// 示例 2：

// 输入：haystack = "leetcode", needle = "leeto"
// 输出：-1
// 解释："leeto" 没有在 "leetcode" 中出现，所以返回 -1 。

// 自己的答案：
/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    return haystack.indexOf(needle)
};

// Gpt答案：
function strStr(haystack, needle) {
    if (!needle) {
        return 0; // 如果 needle 是空字符串，则匹配从 haystack 的起始位置开始
    }
    
    const haystackLength = haystack.length;
    const needleLength = needle.length;
    
    for (let i = 0; i <= haystackLength - needleLength; i++) {
        let j;
        for (j = 0; j < needleLength; j++) {
            if (haystack[i + j] !== needle[j]) {
                break;
            }
        }
        // 如果 j 等于 needleLength，说明匹配成功
        if (j === needleLength) {
            return i;
        }
    }
    
    return -1; // 没有找到匹配项
}

// 示例测试
console.log(strStr("sadbutsad", "sad")); // 输出: 0
console.log(strStr("leetcode", "leeto")); // 输出: -1

// 官方题解：

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function (haystack, needle) {
    let pre = 0,
      after = 0;
    while (after < needle.length && pre < haystack.length) {
      // pre代表需要从哪里开始比较
      if (haystack[after + pre] === needle[after]) {
        after++;
      } else {
      // 如果发现不想等应该剔除掉haystack之前的字符
        pre++;
      // 不相等剔除后，重新开始便利after
        after = 0;
      }
    }
    return after === needle.length ? pre : -1;
  };